﻿using System; 
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Text;
using System.Windows.Forms;
using ADV_Evaluator;
using ADV_Evaluator.Data;
using ADV_Evaluator.Command;
using YD = Yanesdk.Draw;


namespace ADV_Editor.CommandDialog {

    /// <summary>
    /// 「文章の表示」コマンドのダイアログ
    /// </summary>
    partial class MessageOptionDialog : CommandDialogBase {

        Window_Message messageWindow;

        #region 初期化関連
        /// <summary>
        /// 空の状態からはじめるコンストラクタ
        /// </summary>
        public MessageOptionDialog() {
            InitializeComponent();
            pictureBox_Preview.Image = new Bitmap(pictureBox_Preview.ClientSize.Width, pictureBox_Preview.ClientSize.Height);
            CreateMessageWindow();
            SetComponentsValue();
            UpdatePreview();
        }

        /// <summary>
        /// 値をを設定した状態ではじめるコンストラクタ
        /// </summary>
        /// <param name="a">全属性</param>
        public MessageOptionDialog(MessageOptionParams param) {
            InitializeComponent();
            pictureBox_Preview.Image = new Bitmap(pictureBox_Preview.ClientSize.Width, pictureBox_Preview.ClientSize.Height);
            CreateMessageWindow();
            // メッセージウィンドウの各プロパティに対応するparamの値をセットする
            messageWindow.SetParams(param, pictureBox_Preview.ClientSize.Height);
            // フォームに反映
            SetComponentsValue();
            // プレビュー画面描画
            UpdatePreview();
        }
        /// <summary>
        /// 新しいメッセージウィンドウを作成
        /// </summary>
        private void CreateMessageWindow() {
            YD.Win32Window window = new YD.Win32Window(pictureBox_Preview.Handle);  // 形だけ
            window.Screen.Select();
            if (messageWindow != null) {
                messageWindow.Dispose();
            }
            messageWindow = new Window_Message(pictureBox_Preview.ClientSize.Width, pictureBox_Preview.ClientSize.Height);
            messageWindow.Show("This is a preview.\n実際の縮尺とは異なります。");
            window.Screen.Unselect();
            window.Dispose();
        }
        /// <summary>
        /// this.messageWindowの値をもとに、全コンポーネントの値を設定
        /// </summary>
        private void SetComponentsValue() {
            // メッセージウィンドウの初期値に従いフォームの値をセットする
            // ウィンドウ可視状態
            checkBox_WindowVisible.Checked = messageWindow.Visible;
            // ウィンドウ表示位置
            switch (messageWindow.WindowAlign) {
            case WindowAlign.Top:
                radioButton_WIndowAlign_Top.Checked = true; break;
            case WindowAlign.Middle:
                radioButton_WindowAlign_Middle.Checked = true; break;
            case WindowAlign.Bottom:
                radioButton_WindowAlign_Bottom.Checked = true; break;
            }
            // ウィンドウ枠
            checkBox_BorderVisible.Checked = messageWindow.BorderVisible;
            pictureBox_BorderColor.BackColor = messageWindow.BorderColor;
            // テキストの書式
            switch (messageWindow.StringFormat.Alignment) {
            case StringAlignment.Near:
                radioButton_TextAlign_Left.Checked = true; break;
            case StringAlignment.Center:
                radioButton_TextAlign_Center.Checked = true; break;
            case StringAlignment.Far:
                radioButton_TextAlign_Right.Checked = true; break;
            }
            switch (messageWindow.StringFormat.LineAlignment) {
            case StringAlignment.Near:
                radioButton_TextAlign_Top.Checked = true; break;
            case StringAlignment.Center:
                radioButton_TextAlign_Middle.Checked = true; break;
            case StringAlignment.Far:
                radioButton_TextAlign_Bottom.Checked = true; break;
            }
            // 背景色
            pictureBox_SkinColor1.BackColor = Color.FromArgb(255, messageWindow.SkinColor1);
            pictureBox_SkinColor2.BackColor = Color.FromArgb(255, messageWindow.SkinColor2);
            numericUpDown_Alpha1.Value = messageWindow.SkinColor1.A;
            numericUpDown_Alpha2.Value = messageWindow.SkinColor2.A;
            // フォント
            numericUpDown_FontSize.Value = (int)Math.Round(messageWindow.Font.Size);
            // グラデーションの方向
            switch (messageWindow.GradientMode) {
            case LinearGradientMode.BackwardDiagonal:
                radioButton_Gradation_BackwardDiagonal.Checked = true; break;
            case LinearGradientMode.ForwardDiagonal:
                radioButton_Gradation_ForwardDiagonal.Checked = true; break;
            case LinearGradientMode.Horizontal:
                radioButton_Gradation_Horizontal.Checked = true; break;
            case LinearGradientMode.Vertical:
                radioButton_Gradation_Vertical.Checked = true; break;
            }
        }
        /// <summary>
        /// 「設定を初期化」ボタンを選択
        /// </summary>
        private void button_Initialize_Click(object sender, EventArgs e) {
            CreateMessageWindow();
            SetComponentsValue();
            UpdatePreview();
        }

        #endregion

        /// <summary>
        /// メッセージウィンドウをプレビュー画面に描画
        /// </summary>
        private void UpdatePreview() {
            messageWindow.RefreshWithoutTexture();
            using (Graphics g = Graphics.FromImage(pictureBox_Preview.Image)) {
                g.Clear(Color.Black);
                if (messageWindow.Visible) {
                    g.DrawImage(messageWindow.Bitmap, 0, 0);
                }
            }
            pictureBox_Preview.Invalidate();
        }

        /// <summary>
        /// 入力された文章をコマンド化したもの
        /// </summary>
        public override CommandListData Command {
            get {
                MessageOptionParams param = messageWindow.GetParams();
                return new CommandListData(CommandName.文章オプションの変更, param);
            }
        }

        /// <summary>
        /// フォームが閉じた後
        /// </summary>
        private void CommandDialog_MessageOption_FormClosed(object sender, FormClosedEventArgs e) {
            messageWindow.Dispose();
        }


        #region ウィンドウ
        /// <summary>
        /// 「ウィンドウを表示する」のチェックが変わったとき
        /// </summary>
        private void checkBox_WindowVisible_CheckedChanged(object sender, EventArgs e) {
            messageWindow.Visible = checkBox_WindowVisible.Checked;
            UpdatePreview();
        }

        #region 表示位置
        /// <summary>
        /// 表示位置上段にチェック
        /// </summary>
        private void radioButton_WindowAlign_Top_CheckedChanged(object sender, EventArgs e) {
            messageWindow.SetAlign(WindowAlign.Top, pictureBox_Preview.ClientSize.Height);
        }
        /// <summary>
        /// 表示位置中段にチェック
        /// </summary>
        private void radioButton_WindowAlign_Middle_CheckedChanged(object sender, EventArgs e) {
            messageWindow.SetAlign(WindowAlign.Middle, pictureBox_Preview.ClientSize.Height);
        }
        /// <summary>
        /// 表示位置下段にチェック
        /// </summary>
        private void radioButton_WindowAlign_Bottom_CheckedChanged(object sender, EventArgs e) {
            messageWindow.SetAlign(WindowAlign.Bottom, pictureBox_Preview.ClientSize.Height);
        }
        #endregion

        #region ウィンドウ枠
        /// <summary>
        /// 「ウィンドウの枠を表示する」のチェックが変わったとき
        /// </summary>
        private void checkBox_BorderVisible_CheckedChanged(object sender, EventArgs e) {
            pictureBox_BorderColor.Enabled = checkBox_BorderVisible.Checked;
            button_BorderColorSelect.Enabled = checkBox_BorderVisible.Checked;
            messageWindow.BorderVisible = checkBox_BorderVisible.Checked;
            UpdatePreview();
        }
        /// <summary>
        /// 枠の色の選択ボタンを押したとき
        /// </summary>
        private void button_BorderColorSelect_Click(object sender, EventArgs e) {
            ColorDialog dialog = new ColorDialog();
            dialog.Color = pictureBox_BorderColor.BackColor;
            DialogResult result = dialog.ShowDialog();
            if (result == DialogResult.OK) {
                pictureBox_BorderColor.BackColor = dialog.Color;
                messageWindow.BorderColor = dialog.Color;
                UpdatePreview();
            }
        }
        #endregion
        #endregion

        #region 背景

        #region 背景色
        /// <summary>
        /// 背景色１の色選択ボタン
        /// </summary>
        private void button_SkinColorSelect1_Click(object sender, EventArgs e) {
            ColorDialog dialog = new ColorDialog();
            dialog.Color = pictureBox_SkinColor1.BackColor;
            if (dialog.ShowDialog() == DialogResult.OK) {
                pictureBox_SkinColor1.BackColor = dialog.Color;
                messageWindow.SkinColor1 = Color.FromArgb((int)numericUpDown_Alpha1.Value, dialog.Color);
                UpdatePreview();
            }
        }
        /// <summary>
        /// 背景色２の色選択ボタン
        /// </summary>
        private void button_SkinColorSelect2_Click(object sender, EventArgs e) {
            ColorDialog dialog = new ColorDialog();
            dialog.Color = pictureBox_SkinColor1.BackColor;
            if (dialog.ShowDialog() == DialogResult.OK) {
                pictureBox_SkinColor2.BackColor = dialog.Color;
                messageWindow.SkinColor2 = Color.FromArgb((int)numericUpDown_Alpha2.Value, dialog.Color);
                UpdatePreview();
            }
        }
        /// <summary>
        /// 背景色１のアルファ
        /// </summary>
        private void numericUpDown_Alpha1_ValueChanged(object sender, EventArgs e) {
            messageWindow.SkinColor1 = Color.FromArgb((int)numericUpDown_Alpha1.Value, pictureBox_SkinColor1.BackColor);
            UpdatePreview();
        }
        /// <summary>
        /// 背景色２のアルファ
        /// </summary>
        private void numericUpDown_Alpha2_ValueChanged(object sender, EventArgs e) {
            messageWindow.SkinColor2 = Color.FromArgb((int)numericUpDown_Alpha2.Value, pictureBox_SkinColor2.BackColor);
            UpdatePreview();
        }
                #endregion

        #region グラデーション方向
        /// <summary>
        /// 左右
        /// </summary>
        private void radioButton_Gradation_Horizontal_CheckedChanged(object sender, EventArgs e) {
            messageWindow.GradientMode = LinearGradientMode.Horizontal;
            UpdatePreview();
        }
        /// <summary>
        /// 上下
        /// </summary>
        private void radioButton_Gradation_Vertical_CheckedChanged(object sender, EventArgs e) {
            messageWindow.GradientMode = LinearGradientMode.Vertical;
            UpdatePreview();
        }
        /// <summary>
        /// 左上 - 右下
        /// </summary>
        private void radioButton_Gradation_ForwardDiagonal_CheckedChanged(object sender, EventArgs e) {
            messageWindow.GradientMode = LinearGradientMode.ForwardDiagonal;
            UpdatePreview();
        }
        /// <summary>
        /// 右上 - 左下
        /// </summary>
        private void radioButton_Gradation_BackwardDiagonal_CheckedChanged(object sender, EventArgs e) {
            messageWindow.GradientMode = LinearGradientMode.BackwardDiagonal;
            UpdatePreview();
        }
        #endregion
        #endregion

        #region テキスト

        #region フォント
        /// <summary>
        /// フォントサイズ
        /// </summary>
        private void numericUpDown_FontSize_ValueChanged(object sender, EventArgs e) {
            messageWindow.Font = new Font(messageWindow.Font.FontFamily, (int)numericUpDown_FontSize.Value);
            UpdatePreview();
        }
        #endregion

        #region テキストの書式
        /// <summary>
        /// 左揃え
        /// </summary>
        private void radioButton_TextAlign_Left_CheckedChanged(object sender, EventArgs e) {
            messageWindow.StringFormat.Alignment = StringAlignment.Near;
            UpdatePreview();
        }
        /// <summary>
        /// 中央揃え（水平）
        /// </summary>
        private void radioButton_TextAlign_Center_CheckedChanged(object sender, EventArgs e) {
            messageWindow.StringFormat.Alignment = StringAlignment.Center;
            UpdatePreview();
        }
        /// <summary>
        /// 右揃え
        /// </summary>
        private void radioButton_TextAlign_Right_CheckedChanged(object sender, EventArgs e) {
            messageWindow.StringFormat.Alignment = StringAlignment.Far;
            UpdatePreview();
        }
        /// <summary>
        /// 上揃え
        /// </summary>
        private void radioButton_TextAlign_Top_CheckedChanged(object sender, EventArgs e) {
            messageWindow.StringFormat.LineAlignment = StringAlignment.Near;
            UpdatePreview();
        }
        /// <summary>
        /// 中央揃え（垂直）
        /// </summary>
        private void radioButton_TextAlign_Middle_CheckedChanged(object sender, EventArgs e) {
            messageWindow.StringFormat.LineAlignment = StringAlignment.Center;
            UpdatePreview();
        }
        /// <summary>
        /// 下揃え
        /// </summary>
        private void radioButton_TextAlign_Bottom_CheckedChanged(object sender, EventArgs e) {
            messageWindow.StringFormat.LineAlignment = StringAlignment.Far;
            UpdatePreview();
        }
        #endregion
        #endregion

        #region ヘルプ
        /// <summary>
        /// OKボタンのヘルプ
        /// </summary>
        private void button_OK_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "このダイアログを閉じて、コマンドを追加します。");
        }
        /// <summary>
        /// キャンセルボタンのヘルプ
        /// </summary>
        private void button_Cancel_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "変更内容を保存せずにこのダイアログを閉じます。");
        }
        /// <summary>
        /// 設定を初期化 のヘルプ
        /// </summary>
        private void button_Initialize_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "全ての設定事項を初期値に戻します。");
        }
        /// <summary>
        /// ウィンドウを表示する のヘルプ
        /// </summary>
        private void checkBox_WindowVisible_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "チェックをはずすと、ウィンドウが非表示になります。");
        }
        /// <summary>
        /// ウィンドウ位置 のヘルプ
        /// </summary>
        private void groupBox_WindowAlign_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "画面に対するウィンドウの垂直方向の位置を設定します。");
        }
        /// <summary>
        /// ウィンドウの枠 のヘルプ
        /// </summary>
        private void groupBox_WindowBorder_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "ウィンドウに枠線を表示するかどうか設定します。\n表示する場合はその色も設定できます。");
        }
        /// <summary>
        /// プレビュー のヘルプ
        /// </summary>
        private void pictureBox_Preview_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "設定した文章オプションが実際にどのように反映されるかを簡易的に示します。\nウィンドウの大きさの縮尺は実際のものとは異なります。");
        }
        /// <summary>
        /// 背景色１ のヘルプ
        /// </summary>
        private void groupBox_SkinColor1_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "ウィンドウの背景の色を指定します。\nアルファ値は0～255の範囲で、少なくなるに従い背景が透明になります。");
        }
        /// <summary>
        /// 背景色２ のヘルプ
        /// </summary>
        private void groupBox_SkinColor2_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "ウィンドウの背景の色を指定します。\nアルファ値は0～255の範囲で、少なくなるに従い背景が透明になります。");
        }
        /// <summary>
        /// グラデーションの方向 のヘルプ
        /// </summary>
        private void groupBox_GradientMode_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "背景のグラデーションをどのようにかけるかを指定します。\n左上方向には背景色１、右下方向には背景色２が使われます。");
        }
        /// <summary>
        /// テキストの書式 のヘルプ
        /// </summary>
        private void groupBox_TextAlign_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "表示する文章の水平方向および垂直方向の揃え位置を指定します。");
        }
        /// <summary>
        /// フォント のヘルプ
        /// </summary>
        private void groupBox_Font_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "文章の表示に用いるフォントの設定をします。");
        }
        #endregion

    }
}